package com.xiaozheng.mybatis.SqlSession.defaults;

import com.xiaozheng.mybatis.SqlSession.SqlSession;
import com.xiaozheng.mybatis.SqlSession.proxy.MapperProxy;
import com.xiaozheng.mybatis.cfg.Configuration;
import com.xiaozheng.mybatis.utils.DataSourceUtil;

import java.lang.reflect.Proxy;
import java.sql.Connection;

/**
 * @Package: com.xiaozheng.mybatis.SqlSession.defaults
 * @ClassName: DefaultSqlSession
 * @Author: 小政同学    QQ:xiaozheng666888@qq.com
 * @CreateTime: 2020/8/28 12:54
 * @What_is_this_file_for: SqlSession接口的实现
 * @Description: 创建代理对象，实现查询所有方法
 */
public class DefaultSqlSession implements SqlSession {
    private Configuration cfg;
    private Connection connection;

    public DefaultSqlSession(Configuration cfg) {
        this.cfg = cfg;
        connection = DataSourceUtil.getConnection(cfg);
    }

    /**
     * 根据参数创建一个代理对象
     *
     * @param daoInterfaceClass dao的接口字节码
     * @return
     */
    @Override
    public <T> T getMapper(Class<T> daoInterfaceClass) {

        //参数一：代理谁就用谁的类加载器（UserDao），参数二：代理谁就要实现相同的接口，参数三：调用处理的方法调用(传入映射信息)
        return (T) Proxy.newProxyInstance(daoInterfaceClass.getClassLoader(), new Class[]{daoInterfaceClass},
                new MapperProxy(cfg.getMappers(), connection));

    }

    /**
     * 释放资源
     */
    @Override
    public void close() {
        if (connection != null) {
            try {
                connection.close();
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
